package com.ilxqx.framework.generator.core;

import com.ilxqx.framework.generator.po.RawTable;
import com.ilxqx.framework.generator.po.RawTableField;
import com.ilxqx.framework.generator.po.RawTableKey;
import com.ilxqx.framework.util.DbUtils;

import java.util.List;
import java.util.Map;

/**
 * 抽象的原始table信息解析
 * @author venus
 */
public abstract class AbstractRawTableInfoParser implements RawTableInfoParser {

    /**
     * 查询表原始信息
     * @param tableName 表名
     * @return 原始信息
     */
    protected abstract String getTableInfoQuerySql(String tableName);

    /**
     * 获取表字段信息的查询SQL
     * @param tableName 表名
     * @return 查询SQL
     */
    protected abstract String getTableFieldsInfoQuerySql(String tableName);

    /**
     * 获取表键信息的查询SQL
     * @param tableName 表名
     * @return 查询SQL
     */
    protected abstract String getTableKeysInfoQuerySql(String tableName);

    /**
     * 解析原始表信息
     * @param results SQL查询结果
     * @return 原始表信息对象
     */
    protected abstract RawTable parseTableInfo(List<Map<String, Object>> results);

    /**
     * 解析原始表字段
     * @param results SQL查询的结果
     * @return 表字段原始信息
     */
    protected abstract List<RawTableField> parseTableFields(List<Map<String, Object>> results);

    /**
     * 解析原始表键信息
     * @param results SQL查询的结果
     * @return 表键原始信息
     */
    protected abstract List<RawTableKey> parseTableKeys(List<Map<String, Object>> results);

    /**
     * 执行原表信息解析
     *
     * @param tableName 表名
     * @return 解析后的表信息对象
     */
    @Override
    public RawTable perform(String tableName) {
        // 1.解析表信息
        List<Map<String, Object>> tableInfoResults = DbUtils.query(this.getTableInfoQuerySql(tableName));
        RawTable rawTable = this.parseTableInfo(tableInfoResults);

        // 2.解析字段信息
        List<Map<String, Object>> tableFieldsInfoResults = DbUtils.query(this.getTableFieldsInfoQuerySql(tableName));
        List<RawTableField> rawTableFields = this.parseTableFields(tableFieldsInfoResults);

        // 3.解析表键信息
        List<Map<String, Object>> tableKeysInfoResults = DbUtils.query(this.getTableKeysInfoQuerySql(tableName));
        List<RawTableKey> rawTableKeys = this.parseTableKeys(tableKeysInfoResults);

        // 4.组装数据
        rawTable.setRawTableFields(rawTableFields);
        rawTable.setRawTableKeys(rawTableKeys);
        return rawTable;
    }

}
